// 备忘录结构体 `Memento`，用于存储原发器 `Originator` 的状态。
#[derive(Clone)]
struct Memento {
    state: String, // 状态字段，保存原发器的状态信息
}

// 原发器结构体 `Originator`，拥有需要被保存和恢复的状态。
struct Originator {
    state: String, // 状态字段，表示当前状态
}

impl Originator {
    // 构造函数 `new()`，用于创建具有初始状态的原发器。
    fn new(state: &str) -> Self {
        Self {
            state: state.to_string(), // 将传入的初始状态转换为字符串并保存在 `state` 字段中
        }
    }

    // 设置状态的方法 `set_state()`，用于修改当前状态。
    fn set_state(&mut self, state: &str) {
        self.state = state.to_string(); // 将传入的状态字符串赋值给 `state` 字段
    }

    // 创建备忘录 `Memento` 的方法 `save()`，将当前状态保存到备忘录中。
    fn save(&self) -> Memento {
        Memento {
            state: self.state.clone(), // 使用当前状态创建备忘录，并返回备忘录对象
        }
    }

    // 恢复到指定备忘录状态的方法 `restore()`，接受一个 `Memento` 对象作为参数。
    fn restore(&mut self, memento: Memento) {
        self.state = memento.state; // 将备忘录中保存的状态恢复到原发器的 `state` 字段中
    }

    // 显示当前状态的方法 `show_state()`，用于打印当前状态。
    fn show_state(&self) {
        println!("State: {}", self.state); // 打印当前状态
    }
}

// 管理备忘录的 Caretaker 结构体。
struct Caretaker {
    mementos: Vec<Memento>, // 使用 Vec 存储备忘录对象
}

impl Caretaker {
    // 构造函数 `new()`，初始化空的备忘录列表。
    fn new() -> Self {
        Self {
            mementos: Vec::new(), // 初始化一个空的备忘录列表
        }
    }

    // 存储备忘录的方法 `save()`，将备忘录对象添加到备忘录列表中。
    fn save(&mut self, memento: Memento) {
        self.mementos.push(memento); // 将传入的备忘录对象保存到备忘录列表中
    }

    // 恢复备忘录状态的方法 `restore()`，接受一个索引值作为参数，返回对应位置的备忘录对象。
    // 如果索引越界则返回 None。
    fn restore(&self, index: usize) -> Option<Memento> {
        if index < self.mementos.len() {
            Some(self.mementos[index].clone()) // 返回指定索引位置的备忘录对象的克隆
        } else {
            None // 如果索引越界，返回 None
        }
    }
}

// 主函数入口 `main()`，演示备忘录模式的使用。
pub fn main() {
    let mut originator = Originator::new("State1"); // 创建原发器对象，初始状态为 "State1"
    let mut caretaker = Caretaker::new(); // 创建管理备忘录的 Caretaker 对象

    originator.show_state(); // 打印当前原发器的状态
    caretaker.save(originator.save()); // 将当前原发器的状态保存到备忘录中

    originator.set_state("State2"); // 修改原发器的状态为 "State2"
    originator.show_state(); // 打印修改后的原发器状态
    caretaker.save(originator.save()); // 将修改后的状态保存到备忘录中

    originator.set_state("State3"); // 再次修改原发器的状态为 "State3"
    originator.show_state(); // 打印修改后的原发器状态

    if let Some(memento) = caretaker.restore(0) {
        // 恢复到第一个备忘录的状态
        originator.restore(memento); // 使用备忘录对象恢复原发器的状态
        originator.show_state(); // 打印恢复后的原发器状态
    }
}
